linux

中断与中断处理

1.中断   中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向OS反映此信号的到来,然后就由OS负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步--换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断。   不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志。这些中断值通常被称为中断请求(IRQ)线。每个IRQ线都会被关联一个数值量。 2.中断处理程序   在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码。   中断处理程序需要负责通知硬件设备中断已经被…

Read more

Linux下安装docker

  其实一直都听过docker,但没用过,今天参考几篇文档把docker搞定了。果然起的速度比一般虚拟机快很多。   这个总结主要是整理工作,大部分内容都在文章最后的文档里已经有说明。   我的电脑是ubuntu14.04 安装的话用包源进行安装。 $ sudo apt-get install apt-transport-https $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/so…

Read more

linux内核中的数据结构

  linux建议开发者使用其内建的数据结构,而不要自作主张搞一套山寨的。本文讲解内核中常用的4种数据结构:链表,队列,映射,二叉树。 1.链表   链表包括单向链表(有一个后向指针),双向链表(有一个后向指针和一个前向指针),环形链表(首尾相连)。linux内核的标准链表采用环形双向链表形式实现。 1.1 链表数据结构   linux内核方式与众不同,它不是将数据结构塞入链表,而是将链表节点塞入数据结构。比如,一个普通的链表节点: struct Node {   int data;   struct Node *pre;;   struct Node *next; };   linux下的实现是把前后指针抽出来,形成单独数据结构…

Read more

系统调用

1.与内核通信   系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个: 它为用户空间提供了一种硬件的抽象接口。 系统调用保证了系统的稳定和安全。 如果应用程序可以随意访问硬件而内核又对此一无所知的话,几乎没办法实现多任务和虚拟内存。 举例:应用程序调用printf(),调用C库中的printf(),又调用C库中的write(),又调用内核中的write()系统调用。 2.系统调用   在linux中,每个系统调用都被赋予一个系统调用号。   linux系统调用比其他许多OS执行得要快。linux很短的上下文切换时间是一个重要的原因,进出内核都被优化得简洁高效。另外一个原因是系统调用处理程序和每个系统调用本身也都非常简洁。 3.系统调用处理程序   系统调用通知内核的机制是靠软…

Read more

linux下进程调度

  linux 2.6之后内核的进程调度算法是CFS:完全公平调度算法。 1.策略 1.1 I/O消耗性和处理器消耗型的进程   调度策略通常要在两个矛盾的目标中间寻找平衡:进程响应迅速和最大系统利用率了。 1.2 进程优先级   linux采用了两种不同的优先级范围。第一种是用nice值,范围从-20到+19,默认值为0;越大的nice值意味着更低的优先级。相比高nice值的进程,低nice值的进程可以获得更多的处理器时间。nice值也代表时间片的比例。可以通过ps -ef查看系统中的进程列表,结果中标记NI的一列就是进程对应的nice值。   第二种是实时优先级,其值是可配置的,默认情况下它的变化范围从0到99。与nice相反,越高的实时优先级数值意味着进程优先级越高。对应的Linux下是PTPRIO。 1…

Read more

linux下进程管理

1.进程   进程提供两种虚拟机制:虚拟处理器和虚拟内存。   fork()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。通常,创建新的进程都是为了立即执行新的,不同的程序,而接着调用exec()这组函数就可以创建新的地址空间,并把新的程序载入其中。在现代linux内核中,fork()实际上由clone()系统调用实现。   最终,程序通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放掉。父进程可以通过wait4()系统调用查询子进程是否终结。 2.进程描述符及任务结构   内核把进程的列表存放在叫做任务队列(task list)的双向循环链表中。链表中每一项都是类型为task_struct,称为进程描述符的结构。 2.1分配进程描述符   linu…

Read more

Linux socket跨局域网聊天和文件传输

  一直想写一个跨局域网聊天和文件传输,以及视频聊天的软件,这两天刚好闲着没啥事就把代码写完了,代码已经上传至github:https://github.com/vinllen/chat   其实之前想法P2P模式,P2P的话必须穿透NAT,现在的NAT有4种模式: 完全圆锥型NAT 受限圆锥型NAT 端口受限圆锥型NAT 对称NAT(双向NAT) 维基百科给出的定义如下: 1.Full cone NAT,亦即著名的一对一(one-to-one)NAT   一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机都能通过给eAddr:port2发包到达iAddr:port1 2.Address-Restricted…

Read more

linux pdb调试总结

1.首先gdb编译: gcc -g xxx.c -o xxx 2.然后 gdb xxx进入调试 break 行号 添加断点 (1)然后run就可以跑到下一个断点 (2)step(或s)单步跟踪 (3)print可(或p)以查看当前程序的运行数据 比如:print a 输出a变量的值 输出格式可以设置: 比如p/d a 十进制输出a变量的值 (4)也可以设置display,比如display a 这样以后每次调试都会输出a变量的值 (5)examine(或x)查看内存地址中的值 语法:x/ (6)list查看原程序 (7)print x=8 在调试过程中修改变量x的值,下面生效 (8)jump 实现跳转,可以是文件的行号,也可以是file:line,也可以是+num这种格式 jump address是代码行的内存地址 (9)signal 产生信号量 (10) return 强制返…

Read more