liunx 总结

1 计算机的工作原理:

2 C程序的存储空间布局:

工作过程:
1 运行时: 先从内存中取出一条指令
2 通过控制器译码
3 按指令的要求,从主存储器中读取数据
4 进行指定的运算和逻辑操作
5把结果放入内存
6 重复1-5
7 遇到停止指令停止

程序是指令集合。指令:操作数,操作码;
字节:连续的8为二进制序列
地址:内存中每个字节单元的编号
寻址空间:地址总线所包含和地址线根数

内存:
程序和CPU之间的桥梁,计算机中所有程序都在内存中进行。暂时存放CPU中的运算数据,与硬盘交换数据。

MMU: Memory Management Unit 内存管理单元。
《ARM与驱动》
虚拟地址:程序中遐想的地址。

操作系统: 裸机程序,对应源码,内核。 控制和管理程序的运行。用户和计算机的接口。

1 文件分哪几类?
2 linux 文件类型?

系统调用的分类: 进程 ,文件系统类,系统控制,内存管理 网络管理 用户管理 进程间通信

目标文件: 管理和组织其他文件
文件系统: 明确磁盘或分区上的文件的方法和数据结构 即组织文件的方法

inode :文件字节数,文件时间戳,有一个编号

文件描述符:Linux 内核为每个进程维护了一张表,这个表记录了这个进程正在打开的那些文件。表里每条记录都有一个编号,这个编号就是文件描述符。0-64

access 测试文件的访问权限
fcntl 改变文件性质
fstat stat lstat 获取文件元信息。

open-flags : O_TRUNC 丢弃已有内用

void* mmap(void* addr,size_t len int prot,int flags,int fildes,off_t off);创建一段内存指针;
linux : 进程

什么是进程?
进程的内存空间怎么布局的?
程序由exec系列系统调用函数读入内存后执行。
进程是系统分配资源(代码段,数据区,栈,文件描述符等)的基本单位。
进程控制块(PCB):
ps -elf 查看进程 pid (2–32767);
进程终止: 有8种方式
进程的存储空间布局:
堆区与数据区相邻,代码端与数据区不相临,堆向上增长栈向下增长。
多路复用:
int slecte(int ndfs,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval timeout);
1 最大描述符加1, 描述符的个数
4 时间设置
进程的空间分布:
1栈区空间有限 2 函数名代表的代码端首地址
内存分配静态定义:
全局变量,静态变量 数据区
局部变量 函数参数 栈区
复制父进程 PCB;
如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即
返回子进程结束状态值。
waitpid( childpid, &status, 0 );
int kill(pid_t pid,int signo); int raise(int signo)//给自己发信号
int sigaction(int signo,const struct sigaction
act,struct sigaction *oact);指定信号的处理动作
oact :==NULL;

struct sigaction{
void (*sa_handler)(int); /新的信号处理函数指针/
/两个特殊值SIG_IGN忽略信号,SIG_DFL恢复默认行为/
sigset_t sa_mask; /新的进程信号屏蔽字/
int sa_flags; /一般填零/
int sigaddset(sigset_t *set,int signo);/向信号集里增加信号/
int sigemptyset(sigset_t *set);/清空信号集/
int sigfillset(sigset_t *set); /信号集里包含所有信号/
int sigdelset(sigset_t *set,int signo); /从信号集里删除信号/
成功返回0,失败< 0

int sigismember(sigset_t *set,int signo);/判断信号集是否存在指定信号/
存在返回1,如果不是返回0,给定的信号无效返回 < 0

int sigsuspend(const sigset_t *sigmask);
将进程的信号屏蔽字设置为sigmask

int pause(void);
挂起调用进程直到接收到信号
int fcntl(int fildes,int command,…) 对文件描述符操作,
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,
临界区:任务内访问临界资源的代码被称为临界区。
mutex chopstick[5] 全部初始化为1则:
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
eat();
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
think();

int pthread_create(pthread_t * pTid,
const pthread_attr_t * pAttr,
void *(*thread_start)(void *),
void * arg);
功能:创建以thread_start为入口函数的新线程
返回值:成功返回0,失败返回错误编号
参数:pTid:保存新线程的ID
pAttr:指定新线程的属性,见后续小节
thread_start:新线程代码的入口地址
arg:传递给新线程入口函数的实际参数

pthread_join (pthread_t thread,void **ppRVal); 线程终止

pthread_attr_t
int pthread_attr_init(pthread_attr_t * pAttr);
int pthread_attr_destroy(pthread_attr_t * pAttr);
功能:同函数名
参数:
pAttr:指向表示线程属性的结构指针
返回值:成功0,失败错误码
线程分离:pthread_detach(pthread_t tid);

#include<semaphore.h>
类型:sem_t
int sem_init(sem_t *sem,int pshared,unsigned int value);初始化
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
头文件:#include <pthread.h>
类型:pthread_mutex_t
PTHREAD_MUTEX_INITIALIZER 初始化
初始化:int pthread_mutex_init(pthread_mutex_t * mutex, NULL);
清理:int pthread_mutex_destroy(pthread_mutex_t * mutex);
阻塞P操作: int pthread_mutex_lock(pthread_mutex_t * mutex);
非阻塞P操作: int pthread_mutex_trylock(pthread_mutex_t * mutex);
V操作: int pthread_mutex_unlock(pthread_mutex_t * mutex);
头文件:#include <pthread.h>
类型:pthread_cond_t
PTHREAD_COND_INITIALIZER 初始化
初始化:int pthread_cond_init(pthread_cond_t * cond, NULL);
清理:int pthread_cond_destroy(pthread_cond_t * cond);
P操作:
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t mutex);
V操作: int pthread_cond_signal(pthread_cond_t * cond);
1 如何在进程间传递信息?
消息类:信号,管道,消息队列,本地socket
存储类:文件共享,共享内存
同步:信号量
TCP/IP:Socket编程
2 线程如何传递信息?
3 线程共享数据如何处理竞态?
4 进程间共享资源如何处理静态问题?
ipcs -q 查看消息队列
ipcs -s 查看信号量
ipcs -m 查看共享内存
int pipe (int fd[2]) 仅限进程间
int mkfifo(const char
pathname,mode_t mode):mode O_RDONLY O_WRONLY
一般步骤:
先创建 打开 读写 关闭文件 描述符 删除fifo
变长结构体:
struct mymsg{
long datasize;
char mdata[1];
};
消息队列:
int msgget(key_t key,int flag)//key 是ftok 返回的值
原子操作:不被线程机制打断的操作
消息队列,共享内存,信号量
key_t ftok(const char *fname,int id);
IPC_RMID:删除消息队列

int msgctl(int msqid,int cmd,struct msqid_ds *buf)
对消息队列进行cmd操作

int msgsnd(int msgid,const void* ptr,size_t length,int flag)
向指定消息队列放置消息 flag :0 或者IPC_NOWAIT
length :sizeof(自定义结构体)
ssize msgrcv(int msgid,void *ptr,size_t length,long type,int flag)
从指定消息队列取出一个消息
int shmget(key_t key,size_t size,int 0flag);
创建一个新的共享内存或则打开一个共享内存
oflag : mode|IPC_CREATE
int shmget(key_t key,size_t size,int oflag);
创建或则打开一个内存
void shmat(int shmid,const viod shmaddr,int flag);
指定共享空间到调用进程的地址空间
shmid 共享内存的标识符,shmaddr 一般为NULL
int shmdt(const void
shmaddr)
断开共享内存
int shmctl(int shmid,int cmd,struct shmid_ds buff);
对指定共享内存做些控制操作
进程信号量集:进程同步
int semget(key_t key,int nsem,int oflag);
创建一个新的信号量集或则打开一个已经存在的信号量集
int semop(int semid,struct sembuf
opstr,size_t nops)
对指定信号量集进行PV操作
nops :数组包含操作数的个数
int semctl(int semid,int semnum,int cmd,…);
对指定信号量集执行相应命令
IPC-RMID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值