当前位置: 首页 > news >正文

如何建立一个网站卖东西网站侧栏设计

如何建立一个网站卖东西,网站侧栏设计,做网站运营,新手卖家做来赞达网站如何官方基本概念 从系统的角度看#xff0c;进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源#xff0c;并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程#xff0c;实现了进程之间的切换和通信#xff0c;帮助用户管理业务程序…官方基本概念 从系统的角度看进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程实现了进程之间的切换和通信帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。 OpenHarmony内核中的进程采用抢占式调度机制支持时间片轮转调度方式和FIFO调度机制。 OpenHarmony内核的进程一共有32个优先级(0-31)用户进程可配置的优先级有22个(10-31)最高优先级为10最低优先级为31。 高优先级的进程可抢占低优先级进程低优先级进程必须在高优先级进程阻塞或结束后才能得到调度。 每一个用户态进程均拥有自己独立的进程空间相互之间不可见实现进程间隔离。 用户态根进程init由内核态创建其它用户态进程均由init进程fork而来。 进程状态说明 初始化Init该进程正在被创建。 就绪Ready该进程在就绪列表中等待CPU调度。 运行Running该进程正在运行。 阻塞Pend该进程被阻塞挂起。本进程内所有的线程均被阻塞时进程被阻塞挂起。 僵尸态Zombies该进程运行结束等待父进程回收其控制块资源。 Init→Ready 进程创建或fork时拿到该进程控制块后进入Init状态处于进程初始化阶段当进程初始化完成将进程插入调度队列此时进程进入就绪状态。 Ready→Running 进程创建后进入就绪态发生进程切换时就绪列表中最高优先级的进程被执行从而进入运行态。若此时该进程中已无其它线程处于就绪态则该进程从就绪列表删除只处于运行态若此时该进程中还有其它线程处于就绪态则该进程依旧在就绪队列此时进程的就绪态和运行态共存。 Running→Pend 进程内所有的线程均处于阻塞态时进程在最后一个线程转为阻塞态时同步进入阻塞态然后发生进程切换。 Pend→Ready / Pend→Running 阻塞进程内的任意线程恢复就绪态时进程被加入到就绪队列同步转为就绪态若此时发生进程切换则进程状态由就绪态转为运行态。 Ready→Pend 进程内的最后一个就绪态线程处于阻塞态时进程从就绪列表中删除进程由就绪态转为阻塞态。 Running→Ready 进程由运行态转为就绪态的情况有以下两种 有更高优先级的进程创建或者恢复后会发生进程调度此刻就绪列表中最高优先级进程变为运行态那么原先运行的进程由运行态变为就绪态。若进程的调度策略为SCHED_RR且存在同一优先级的另一个进程处于就绪态则该进程的时间片消耗光之后该进程由运行态转为就绪态另一个同优先级的进程由就绪态转为运行态。 Running→Zombies 当进程的主线程或所有线程运行结束后进程由运行态转为僵尸态等待父进程回收资源。 使用场景 进程创建后用户只能操作自己进程空间的资源无法操作其它进程的资源共享资源除外。用户态允许进程挂起恢复延时等操作同时也可以设置用户态进程调度优先级和调度策略获取进程调度优先级和调度策略。进程结束的时候进程会主动释放持有的进程资源但持有的进程pid资源需要父进程通过wait/waitpid或父进程退出时回收。 开始正式分析 对应张大爷的故事进程就是那些在场馆外32个队列里排队的那些队列就是进程的就绪队列。 请注意 进程是资源管理单元 而非最终调度单元调度单元是谁是 Task 看下官方对应状态定义 #define OS_PROCESS_STATUS_INIT 0x0010U //进程初始状态 #define OS_PROCESS_STATUS_READY 0x0020U //进程就绪状态 #define OS_PROCESS_STATUS_RUNNING 0x0040U //进程运行状态 #define OS_PROCESS_STATUS_PEND 0x0080U //进程阻塞状态 #define OS_PROCESS_STATUS_ZOMBIES 0x100U //进程僵死状态 一个进程从创建到消亡过程在内核肯定是极其复杂的。为了方便理解进程整个系列文章笔者会用张大爷的故事打比方从生活中的例子来将神秘的系统内核外化解剖出来给大家看。一件这么复杂的事情肯定会有个复杂的结构体来承载它就是LosProcessCB(进程控制块)代码很长但必须全部拿出来。 LITE_OS_SEC_BSS LosProcessCB *g_runProcess[LOSCFG_KERNEL_CORE_NUM]; //用一个指针数组记录进程运行LOSCFG_KERNEL_CORE_NUM 为 CPU的核数 LITE_OS_SEC_BSS LosProcessCB *g_processCBArray NULL;//进程池最大进程数为 64个 LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;//记录空闲的进程链表 LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecyleList;//记录回收的进程列表typedef struct ProcessCB {CHAR processName[OS_PCB_NAME_LEN]; /** Process name */ //进程名称UINT32 processID; /** process ID leader thread ID */ //进程ID,由进程池分配,范围[0,64]UINT16 processStatus; /** [15:4] process Status; [3:0] The number of threads currentlyrunning in the process *///这里设计很巧妙.用一个16表示了两层逻辑 数量和状态,点赞!UINT16 priority; /** process priority */ //进程优先级UINT16 policy; /** process policy */ //进程的调度方式,默认抢占式UINT16 timeSlice; /** Remaining time slice *///进程时间片,默认2个tickUINT16 consoleID; /** The console id of task belongs *///任务的控制台id归属UINT16 processMode; /** Kernel Mode:0; User Mode:1; */ //模式指定为内核还是用户进程UINT32 parentProcessID; /** Parent process ID */ //父进程IDUINT32 exitCode; /** process exit status */ //进程退出状态码LOS_DL_LIST pendList; /** Block list to which the process belongs */ //进程所属的阻塞列表,如果因拿锁失败,就由此节点挂到等锁链表上LOS_DL_LIST childrenList; /** my children process list */ //孩子进程都挂到这里,形成双循环链表LOS_DL_LIST exitChildList; /** my exit children process list */ //那些要退出孩子进程挂到这里白发人送黑发人。LOS_DL_LIST siblingList; /** linkage in my parents children list */ //兄弟进程链表, 56个民族是一家,来自同一个父进程.ProcessGroup *group; /** Process group to which a process belongs */ //所属进程组LOS_DL_LIST subordinateGroupList; /** linkage in my group list */ //进程是组长时,有哪些组员进程UINT32 threadGroupID; /** Which thread group , is the main thread ID of the process */ //哪个线程组是进程的主线程IDUINT32 threadScheduleMap; /** The scheduling bitmap table for the thread group of theprocess */ //进程的各线程调度位图LOS_DL_LIST threadSiblingList; /** List of threads under this process *///进程的线程(任务)列表LOS_DL_LIST threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /** The processs thread group schedules thepriority hash table */ //进程的线程组调度优先级哈希表volatile UINT32 threadNumber; /** Number of threads alive under this process */ //此进程下的活动线程数UINT32 threadCount; /** Total number of threads created under this process */ //在此进程下创建的线程总数LOS_DL_LIST waitList; /** The process holds the waitLits to support wait/waitpid *///进程持有等待链表以支持wait/waitpid #if (LOSCFG_KERNEL_SMP YES)UINT32 timerCpu; /** CPU core number of this task is delayed or pended *///统计各线程被延期或阻塞的时间 #endifUINTPTR sigHandler; /** signal handler */ //信号处理函数,处理如 SIGSYS 等信号 sigset_t sigShare; /** signal share bit */ //信号共享位 #if (LOSCFG_KERNEL_LITEIPC YES)ProcIpcInfo ipcInfo; /** memory pool for lite ipc */ //用于进程间通讯的虚拟设备文件系统,设备装载点为 /dev/lite_ipc #endifLosVmSpace *vmSpace; /** VMM space for processes */ //虚拟空间,描述进程虚拟内存的数据结构linux称为内存描述符 #ifdef LOSCFG_FS_VFSstruct files_struct *files; /** Files held by the process */ //进程所持有的所有文件注者称之为进程的文件管理器 #endif //每个进程都有属于自己的文件管理器,记录对文件的操作. 注意:一个文件可以被多个进程操作timer_t timerID; /** iTimer */#ifdef LOSCFG_SECURITY_CAPABILITY //安全能力User *user; //进程的拥有者UINT32 capability; //安全能力范围 对应 CAP_SETGID #endif #ifdef LOSCFG_SECURITY_VIDTimerIdMap timerIdMap; #endif #ifdef LOSCFG_DRIVERS_TZDRIVERstruct file *execFile; /** Exec bin of the process */ #endifmode_t umask; } LosProcessCB; 进程的模式有两种内核态和用户态能想到main函数中肯定会创建一个内核态的最高优先级进程他就是 KProcess 通过task命令查看任务运行状态可以看到 KProcess 进程 ,看名字就知道是一个内核进程在系统启动时创建图中可以看到 KProcess 的task运行情况从表里可以看到KProcess内有 10几个task 进程模块是如何初始化的 KProcess 在张大爷的故事里相当于场馆的工作人员他们也要接受张大爷的调度排队进场但他们的优先级是最高的0级他们进场后需完成场馆的准备工作再开门做生意。如果需要多个工作人员怎么办就是通过fork,简单说就是复制一个复制的前提是需要有一个鸿蒙里就是KProcess其他工作人员都是通过它fork的。 那用户怎么来的呢就是真正要排队的人也是一样先创建一个用户祖先其他用户皆由祖先fork来的。 注意用户进程和内核进程的祖先是不一样的,有各自的祖先根.分别是g_userInitProcess(1号) 和 g_kernelInitProcess(2号) /******************************************************************************并发Concurrent:多个线程在单个核心运行同一时间一个线程运行系统不停切换线程看起来像同时运行实际上是线程不停切换并行Parallel每个线程分配给独立的CPU核心线程同时运行单核CPU多个进程或多个线程内能实现并发微观上的串行宏观上的并行多核CPU线程间可以实现宏观和微观上的并行LITE_OS_SEC_BSS 和 LITE_OS_SEC_DATA_INIT 是告诉编译器这些全局变量放在哪个数据段 ******************************************************************************/ LITE_OS_SEC_BSS LosProcessCB *g_runProcess[LOSCFG_KERNEL_CORE_NUM];// CPU内核个数,超过一个就实现了并行 LITE_OS_SEC_BSS LosProcessCB *g_processCBArray NULL; // 进程池数组 LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;// 空闲状态下的进程链表, .个人觉得应该取名为 g_freeProcessList note_thinking LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecyleList;// 需要回收的进程列表 LITE_OS_SEC_BSS UINT32 g_userInitProcess OS_INVALID_VALUE;// 用户态的初始init进程,用户态下其他进程由它 fork LITE_OS_SEC_BSS UINT32 g_kernelInitProcess OS_INVALID_VALUE;// 内核态初始Kprocess进程,内核态下其他进程由它 fork LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess OS_INVALID_VALUE;// 内核态idle进程,由Kprocess fork LITE_OS_SEC_BSS UINT32 g_processMaxNum;// 进程最大数量,默认64个 LITE_OS_SEC_BSS ProcessGroup *g_processGroup NULL;// 全局进程组,负责管理所有进程组//进程模块初始化,被编译放在代码段 .init 中 LITE_OS_SEC_TEXT_INIT UINT32 OsProcessInit(VOID) {UINT32 index;UINT32 size;g_processMaxNum LOSCFG_BASE_CORE_PROCESS_LIMIT;//默认支持64个进程size g_processMaxNum * sizeof(LosProcessCB);//算出总大小g_processCBArray (LosProcessCB *)LOS_MemAlloc(m_aucSysMem1, size);// 进程池占用内核堆,内存池分配 if (g_processCBArray NULL) {return LOS_NOK;}(VOID)memset_s(g_processCBArray, size, 0, size);//安全方式重置清0LOS_ListInit(g_freeProcess);//进程空闲链表初始化创建一个进程时从g_freeProcess中申请一个进程描述符使用LOS_ListInit(g_processRecyleList);//进程回收链表初始化,回收完成后进入g_freeProcess等待再次被申请使用for (index 0; index g_processMaxNum; index) {//进程池循环创建g_processCBArray[index].processID index;//进程ID[0-g_processMaxNum]赋值g_processCBArray[index].processStatus OS_PROCESS_FLAG_UNUSED;// 默认都是白纸一张,贴上未使用标签LOS_ListTailInsert(g_freeProcess, g_processCBArray[index].pendList);//注意g_freeProcess挂的是pendList节点,所以使用要通过OS_PCB_FROM_PENDLIST找到进程实体.}g_userInitProcess 1; /* 1: The root process ID of the user-mode process is fixed at 1 *///用户模式的根进程LOS_ListDelete(g_processCBArray[g_userInitProcess].pendList);// 清空g_userInitProcess pend链表g_kernelInitProcess 2; /* 2: The root process ID of the kernel-mode process is fixed at 2 *///内核模式的根进程LOS_ListDelete(g_processCBArray[g_kernelInitProcess].pendList);// 清空g_kernelInitProcess pend链表return LOS_OK; } 代码已经很清楚创建了一个进程池默认64个进程也就是不改宏LOSCFG_BASE_CORE_PROCESS_LIMIT的情况下 系统最多是64个进程但有两个进程先被占用用户态和内核态各一个他们是后续创建进程的根所以最多留给外面的只有 62个进程可创建代码的最后两个根进程的task阻塞链表被清空了,因为没有阻塞任务当然要清空. 内核态根进程创建过程 创建Kprocess进程也就是线程池中的2号进程g_kernelInitProcess设为最高优先级 0 //初始化 2号进程,即内核根进程 LITE_OS_SEC_TEXT_INIT UINT32 OsKernelInitProcess(VOID) {LosProcessCB *processCB NULL;UINT32 ret;ret OsProcessInit();// 初始化进程模块全部变量,创建各循环双向链表if (ret ! LOS_OK) {return ret;}processCB OS_PCB_FROM_PID(g_kernelInitProcess);// 以PID方式得到一个进程ret OsProcessCreateInit(processCB, OS_KERNEL_MODE, KProcess, 0);// 初始化进程,最高优先级0,鸿蒙进程一共有32个优先级(0-31) 其中0-9级为内核进程,用户进程可配置的优先级有22个(10-31)if (ret ! LOS_OK) {return ret;}processCB-processStatus ~OS_PROCESS_STATUS_INIT;// 进程初始化位 置1g_processGroup processCB-group;//全局进程组指向了KProcess所在的进程组LOS_ListInit(g_processGroup-groupList);// 进程组链表初始化OsCurrProcessSet(processCB);// 设置为当前进程return OsCreateIdleProcess();// 创建一个空闲状态的进程 }//创建一个名叫KIdle的进程,给CPU空闲的时候使用 STATIC UINT32 OsCreateIdleProcess(VOID) {UINT32 ret;CHAR *idleName Idle;LosProcessCB *idleProcess NULL;Percpu *perCpu OsPercpuGet();UINT32 *idleTaskID perCpu-idleTaskID;//得到CPU的idle taskret OsCreateResourceFreeTask();// 创建一个资源回收任务,优先级为5 用于回收进程退出时的各种资源if (ret ! LOS_OK) {return ret;}//创建一个名叫KIdle的进程,并创建一个idle task,CPU空闲的时候就待在 idle task中等待被唤醒ret LOS_Fork(CLONE_FILES, KIdle, (TSK_ENTRY_FUNC)OsIdleTask, LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE);if (ret 0) {return LOS_NOK;}g_kernelIdleProcess (UINT32)ret;//返回进程IDidleProcess OS_PCB_FROM_PID(g_kernelIdleProcess);//通过ID拿到进程实体*idleTaskID idleProcess-threadGroupID;//绑定CPU的IdleTask,或者说改变CPU现有的idle任务OS_TCB_FROM_TID(*idleTaskID)-taskStatus | OS_TASK_FLAG_SYSTEM_TASK;//设定Idle task 为一个系统任务 #if (LOSCFG_KERNEL_SMP YES)OS_TCB_FROM_TID(*idleTaskID)-cpuAffiMask CPUID_TO_AFFI_MASK(ArchCurrCpuid());//多核CPU的任务指定,防止乱串了,注意多核才会有并行处理 #endif(VOID)memset_s(OS_TCB_FROM_TID(*idleTaskID)-taskName, OS_TCB_NAME_LEN, 0, OS_TCB_NAME_LEN);//task 名字先清0(VOID)memcpy_s(OS_TCB_FROM_TID(*idleTaskID)-taskName, OS_TCB_NAME_LEN, idleName, strlen(idleName));//task 名字叫 idlereturn LOS_OK; } 用户态根进程创建过程 创建Init进程也就是线程池中的1号进程g_userInitProcess优先级为 28,好低啊 /*** ingroup los_process* User state root process default priority*/ #define OS_PROCESS_USERINIT_PRIORITY 28//所有的用户进程都是使用同一个用户代码段描述符和用户数据段描述符它们是__USER_CS和__USER_DS也就是每个进程处于用户态时它们的CS寄存器和DS寄存器中的值是相同的。当任何进程或者中断异常进入内核后都是使用相同的内核代码段描述符和内核数据段描述符它们是__KERNEL_CS和__KERNEL_DS。这里要明确记得内核数据段实际上就是内核态堆栈段。 LITE_OS_SEC_TEXT_INIT UINT32 OsUserInitProcess(VOID) {INT32 ret;UINT32 size;TSK_INIT_PARAM_S param { 0 };VOID *stack NULL;VOID *userText NULL;CHAR *userInitTextStart (CHAR *)__user_init_entry;//代码区开始位置 ,所有进程CHAR *userInitBssStart (CHAR *)__user_init_bss;// 未初始化数据区BSS。在运行时改变其值CHAR *userInitEnd (CHAR *)__user_init_end;// 结束地址UINT32 initBssSize userInitEnd - userInitBssStart;UINT32 initSize userInitEnd - userInitTextStart;LosProcessCB *processCB OS_PCB_FROM_PID(g_userInitProcess);ret OsProcessCreateInit(processCB, OS_USER_MODE, Init, OS_PROCESS_USERINIT_PRIORITY);// 初始化用户进程,它将是所有应用程序的父进程if (ret ! LOS_OK) {return ret;}userText LOS_PhysPagesAllocContiguous(initSize PAGE_SHIFT);// 分配连续的物理页if (userText NULL) {ret LOS_NOK;goto ERROR;}(VOID)memcpy_s(userText, initSize, (VOID *)__user_init_load_addr, initSize);// 安全copy 经加载器load的结果 __user_init_load_addr - userTextret LOS_VaddrToPaddrMmap(processCB-vmSpace, (VADDR_T)(UINTPTR)userInitTextStart, LOS_PaddrQuery(userText),initSize, VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE |VM_MAP_REGION_FLAG_PERM_EXECUTE | VM_MAP_REGION_FLAG_PERM_USER);// 虚拟地址与物理地址的映射if (ret 0) {goto ERROR;}(VOID)memset_s((VOID *)((UINTPTR)userText userInitBssStart - userInitTextStart), initBssSize, 0, initBssSize);// 除了代码段其余都清0stack OsUserInitStackAlloc(g_userInitProcess, size);// 初始化堆栈区if (stack NULL) {PRINTK(user init process malloc user stack failed!\n);ret LOS_NOK;goto ERROR;}param.pfnTaskEntry (TSK_ENTRY_FUNC)userInitTextStart;// 从代码区开始执行也就是应用程序main 函数的位置param.userParam.userSP (UINTPTR)stack size;// 指向栈顶param.userParam.userMapBase (UINTPTR)stack;// 栈底param.userParam.userMapSize size;// 栈大小param.uwResved OS_TASK_FLAG_PTHREAD_JOIN;// 可结合的joinable能够被其他线程收回其资源和杀死ret OsUserInitProcessStart(g_userInitProcess, param);// 创建一个任务来运行main函数if (ret ! LOS_OK) {(VOID)OsUnMMap(processCB-vmSpace, param.userParam.userMapBase, param.userParam.userMapSize);goto ERROR;}return LOS_OK;ERROR:(VOID)LOS_PhysPagesFreeContiguous(userText, initSize PAGE_SHIFT);//释放物理内存块OsDeInitPCB(processCB);//删除PCB块return ret; }
http://www.dnsts.com.cn/news/74687.html

相关文章:

  • 开发手机应用网站网站开发英文
  • 北京建设部网站 信息中心网站用ps下拉效果怎么做的
  • 河北搜恒不给做网站微信广告朋友圈投放
  • 两性做受技巧视频网站wordpress 百度云网盘
  • 仪征建设局网站查域名是否注册
  • 锦州网站优化律师网站设计
  • 河南省住房和城乡建设厅查询网站首页谷歌建站
  • 网站专题策划方案书如何在iis下建设网站
  • 公司网站 自己是空间服务商 cmswordpress数据库创建
  • 百合网 网站 开发淘宝网站的建设目标是
  • 临沧网站搭建企业内部网站设计
  • 公司网站开发和设计 怎么开票厦门百城建设有限公司网站
  • 有关应用网站企业邮箱注册步骤
  • 四平网站建设哪家好网站根目录怎么写
  • 女人吃男人做床视频网站WordPress5.1后台常规没有备案
  • 吴中网站建设好看的界面设计
  • 中文网站建设开发wordpress后台菜单如何修改
  • 长春做网站好的公司网站每年维护费用
  • 宜春公司做网站网站可以用中国二字做抬头吗
  • 遵义网站建设有限公司关于com的网站
  • 惠州住房和城乡建设局网站绵阳网站建设价格
  • 成品网站源码68w68有哪些可以做任务的网站
  • 营销型网站的设计步骤做网站自己申请域名还是建站公司
  • 有哪些网站是静态网站网站建设与管理软件
  • 电脑网站制作软件注册网约车主需要什么条件
  • 做自媒体网站需要注册什么公司万网发布网站
  • 大兴网站建设公司网站如何做静态化
  • 十大免费建站程序wordpress琪歌 wordpress
  • 建立装修网站设计山东省商务厅网站开发区管理处
  • 小型网站建设价格和wordpress类似的开源博客