How does the Linux kernel manage process scheduling and memory allocation, and what is virtual memory?