linux_进程和线程

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,消息队列 ,简单

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值