충청북도 청원 출신. 일본 쥬오대학(中央大學) 재학 중인 1944년에 학도병에 입대, 소위로 임관되었으나, 일본의 항복으로 귀국하였다. 귀국 후 좌익세력이 결성한 ‘학병동맹’에 대항하여 만들어진 ‘학병단’에 가입하여 활동하다가 군사영어학교에 입교, 1946년 1월 육군 소위로 임관하였다.
임관 후 제3연대 창설에 참여하였고, 계속 승진하여 1949년에 대령이 되었다. 제1연대장에 재직중이던 1949년 5월포천 북방 사직리에서 북한 공산군 2개 중대 병력을 섬멸함으로써, 6·25전쟁 이전 북한 공산군과의 접전에서 최대의 전과를 올렸다.
북한 공산군의 6·25전쟁 당시에는 제6사단장으로서 춘천·홍천 방면으로 공격해 오는 북한 공산군의 진격을 5일간이나 지연시킴으로써, 공산군의 진공계획에 큰 차질을 가져오게 하였다.
충청북도 음성에서는 북한 공산군 15사단 48연대를 기습하여 사살 1천 명, 포로 97명과 수많은 장비를 빼앗는 등 개전 이래 최대의 전과를 올렸으며, 이 전공으로 7월 육군 준장으로 승진하였다. 같은 해 9월 낙동강 방어선에서 반격작전에 나선 김종오 사단은 10월 26일 초산을 점령, 한만 국경에 최초로 태극기를 꽂았다.
북진작전 중 부상으로 제9사단장으로 전보된 다음, 육군본부 일반참모비서장·제1군단 참모장·제3사단장·육군본부 인사국장 등 요직을 역임하였다.
1952년 휴전회담에서 군사분계선 획정문제를 두고 막바지 줄다리기를 하고 있을 때 전방의 제9사단장으로 임명되어, 중공군 정예사단들과 백마고지를 두고 10일 동안 24번이나 계속된 뺏고 빼앗기는 혈전을 지휘하였다. 이 전투 끝에 중공군을 완패시킴으로써 휴전회담에도 큰 정치적 영향을 미치게 하였다.
그 뒤 육군사관학교 교장·제1군단장·제5군단장·교육총본부 총장·육군참모 차장·국방연구원장·제1군 사령관·국방부 합동참모본부 총장 등을 지냈다.
5·16군사정변 직후인 1961년 6월에는 제15대 육군참모총장에 취임하고, 1962년에 육군 대장이 되었다. 1963년 6월 임기 만료로 육군참모총장직을 사임하고, 겸임하고 있던 합동참모회의 의장으로 있다가 1965년 지병으로 예비역에 편입되어 1966년에 사망, 국립묘지에 안장되었다.