王道考研复习-操作系统-进程管理(二) (2)

进程控制块

进程的描述信息 进程控制和管理信息 资源分配清端 处理机相关信息
进程标示符   进程当前状态   代码段指针   通用寄存器值  
用户标示符   进程优先级   数据段指针   地址寄存器值  
  代码运行入口地址   堆栈指针   控制寄存器值  
  程序的外存地址   文件描述符   标志寄存器  
  进入内存的事件   键盘   状态字  
  处理机占用的事件   鼠标    
  信号量      
- mac上的进程可视化界面,除了 寄存器没能很直观的看出,其它的基本都能找到对应关系,另外这里多了挂起队列比书上的状态多了一些,应该是苹果系统对进程的控制做了更多的优化和改进的缘故。 ![](media/16026041703877/16026080890448.jpg)

kernel_liteos中PCB的定义如下

typedef struct ProcessCB { CHAR processName[OS_PCB_NAME_LEN]; /**< Process name */ 进程名称
UINT32 processID; /**< Process ID */ 进程id
UINT16 processStatus; /**< [15:4] Process Status; 进程状态[3:0] The number of threads currently
running in the process */
UINT16 priority; /**< Process priority */ 进程优先级
UINT16 policy; /**< Process policy */ 进程管理策略
UINT16 timeSlice; /**< Remaining time slice */ 进程剩余 时间片
UINT16 consoleID; /**< The console id of task belongs */ 日志输出相关,便于区分进程的日志信息
UINT16 processMode; /**< Kernel Mode:0; User Mode:1; */ 区分内核调用还是用户调用
UINT32 parentProcessID; /**< Parent process ID */ 父进程id
UINT32 exitCode; /**< Process exit status */ 进程退出的code
LOS_DL_LIST pendList; /**< Block list to which the process belongs */ PCB当前所在的队列,如等待队列,就绪队列
LOS_DL_LIST childrenList; /**< Children process list */ 它所关联的子进程
LOS_DL_LIST exitChildList; /**< Exit children process list */
LOS_DL_LIST siblingList; /**< Linkage in parent\'s children list */
ProcessGroup *group; /**< Process group to which a process belongs */ 进程组
LOS_DL_LIST subordinateGroupList; /**< Linkage in group list */
UINT32 threadGroupID; /**< Which thread group , is the main thread ID of the process */
UINT32 threadScheduleMap; /**< The scheduling bitmap table for the thread group of the
process */
LOS_DL_LIST threadSiblingList; /**< List of threads under this process */
LOS_DL_LIST threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process\'s thread group schedules the
priority 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 */
#if (LOSCFG_KERNEL_SMP == YES)
UINT32 timerCpu; /**< CPU core number of this task is delayed or pended */
#endif
UINTPTR sigHandler; /**< Signal handler */ 捕获进程成义仓你用
sigset_t sigShare; /**< Signal share bit */
#if (LOSCFG_KERNEL_LITEIPC == YES)
ProcIpcInfo ipcInfo; /**< Memory pool for lite ipc */
#endif
LosVmSpace *vmSpace; /**< VMM space for processes */
#ifdef LOSCFG_FS_VFS
struct files_struct *files; /**< Files held by the process */
#endif
timer_t timerID; /**< ITimer */
#ifdef LOSCFG_SECURITY_CAPABILITY
User *user;
UINT32 capability;
#endif
#ifdef LOSCFG_SECURITY_VID
TimerIdMap timerIdMap;
#endif
#ifdef LOSCFG_DRIVERS_TZDRIVER
struct file *execFile; /**< Exec bin of the process */ 执行文件
#endif
mode_t umask;
} LosProcessCB;

程序段: 能被进程调度程序调度到CPU执行的程序段代码,程序可以被多个进程共享,及多个进程可以运行同一个程序.

数据段: 一个进程的数据段,可以是进程对应用程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果

进程通信

共享存储: 通过共享空间来实现,比如共享内存中某个字典,共享磁盘空间

消息传递: 进程与进程之间通过各自的端口来收发消息,(从表现形式来看Flutter的Isolate的实现方式也比较像是一种消息传递)

管道通信: 管道(pipe)通信是消息通信的一种特殊传递方式,链接一个读进程和一个写进程

在Lunix中管道通信是一种非常频繁的通信机制,管道也是一种文件,他和一般的文件略有不通,是一个固定大小的缓冲区

管道传递数据需要注意数据的读写同步问题,数据一段读取他就会从管道中释放,

管道只能采用半双工通信,某一个时刻只能单向传输,要实现父子进程双方互动通信,则需要两个管道。

线程和多线程模型

概念

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdpwy.html