1,进程(交互,管理,守护)
(1,资源管理的最小单位
(2,执行模式:用户模式,内核模式
(3,几种状态:运行,停止,等待,僵尸,等
(4,进程调度命令:ps(ps -alx, ps -ef, ps -eLf), nice, kill, top
2,进程机制:使用fork创建,进程控制块(PCB),拷贝了父进程的整个地址空间,实则“写操作是拷贝(子进程需要改变内存数据时才拷贝父进程)”
3,exec函数族:偷梁换柱,在进程中启动另一个程序执行的方法
4,进程退出:_exit(参数)系统调用,不会清理缓存, exit(参数)库调用,会清理缓存
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int option)
wait函数用于父进程等待子进程消亡
5,守护进程编写:
(1,创建子进程,父进程退出
(2,在子进程创建新会话 setsid()
(3,改变当前目录为根目录 chdir("/")
(4,重设文件权限掩码 umask(0)
(5,关闭文件描述符 close();
(6,守护进程完成的操作
6,线程:轻量级的进程,用task_struct来描述,每个线程会有一个task_struct来管理
进程创建:int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);
进程退出:void pthread_exit(void *rval_ptr);
(父)进程等待(子):int pthread_join(pthread_t thread, void **rval_ptr);
(父)进程取消(子):int pthread_cancel(pthread_t tid);
父子线程资源分离,用于多线程:pthread_detach()
7,线程间的同步和互斥
同步:按照一定顺序相互配合完成一件事
信号量:代表某一资源,其值表示资源数量。p(申请资源)v(释放资源)
信号量初始化 :int sem_init(sem_t *sem, int pshared, unsigned int value);
信号量申请资源(p):int sem_wait(sem_t *sem);//p
信号量释放资源(v):int sem_post(sem_t *sem);//v
互斥锁:保证资源的完整性,(信号量也可以实现)
锁初始化:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
上锁 :int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁 :int pthread_mutex_unlock(pthread_mutex_t *mutex);
8,进程间通信:
传统:无名管道,有名管道,信号
system V IPC:共享内存,消息队列,信号灯
BSD:套接字
9,无名管道:半双工,具有亲缘间通信。基于文件描述符,f[0]:读管道,f[1]:写管道。
关于管道破裂和阻塞总结如下:
(1,管道两端都打开:满写阻塞,空读阻塞
(2,某一段关闭: 无读写满破裂,无写读完返回0
10,fifo:可用于不互相关进程,先进先出,不支持lseek(),通过文件读写,前提打开(创建)管道。
创建管道文件:int mkfifo(const char *filename, mode_t mode)//mode权限
11,信号:用于内核和用户通信,处理方式:忽略,捕捉,执行
定义方式:void (*signal(int signum, void(*handler)(int)))(int)
12,共享内存:最高效进程间的通信方式。通过ipcs查看状态,ipcrm 删除ipc对象,否则会一直保留在系统
步骤:(获得key-ftok())创建(打开)内存->映射->...->取消映射->删除共享内存
创建:int shmget(key_t key, int size, int shmflg);
映射:void *shmat(int shmid, const void *shmaddr, int shmflg);
撤销:int shmdt(const void *shmaddr);
删除:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
13,消息队列:多个fifo的集合。获得key->创建队列->写->读->控制(删除)。
创建:int msgget(key_t key, int flag)
写 :int msgsnd(int msqid, const void *msgp, size_t size, int flag)
读 :int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)
控制:int msgctl(int msgqid, int cmd, struct msqid_ds *buf)
14,信号灯(信号量):不同进程间同步的机制。posix是单个计数信号灯
创建:int semget(key_t key, int nsems, int semflg)
pv: int semop(int semid, struct sembuf *opsptr, size_t nops)
设置:int semctl(int semid, int semnum, int cmd ...)
一般使用:
1,共享内存+信号灯,高效但是复杂
2,消息队列 ,简单